<!DOCTYPE html>



  


<html class="theme-next pisces use-motion" lang="">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
















  
  
  <link href="/blog/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />







<link href="/blog/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/blog/css/main.css?v=5.1.4" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/blog/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/blog/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/blog/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/blog/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="Hexo, NexT" />










<meta name="description" content="封装一、  什么是错误 一般情况下，错误是指源代码不符合语法规范，然后编译报错 后果: 程序无法编译  什么是Bug？ 程序可以编译、链接、执行，但是程序执行的结果不是我们预想的。 解决: 通过调试寻找发生Bug的原因.">
<meta name="keywords" content="Android、iOS、Web、React Native">
<meta property="og:type" content="article">
<meta property="og:title" content="Objective-C-学习第三天">
<meta property="og:url" content="http://yoursite.com/blog/2018/08/06/Object-C/Objective-C-学习第三天/index.html">
<meta property="og:site_name" content="凌浩雨_博客">
<meta property="og:description" content="封装一、  什么是错误 一般情况下，错误是指源代码不符合语法规范，然后编译报错 后果: 程序无法编译  什么是Bug？ 程序可以编译、链接、执行，但是程序执行的结果不是我们预想的。 解决: 通过调试寻找发生Bug的原因.">
<meta property="og:locale" content="default">
<meta property="og:updated_time" content="2018-08-06T10:34:23.982Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Objective-C-学习第三天">
<meta name="twitter:description" content="封装一、  什么是错误 一般情况下，错误是指源代码不符合语法规范，然后编译报错 后果: 程序无法编译  什么是Bug？ 程序可以编译、链接、执行，但是程序执行的结果不是我们预想的。 解决: 通过调试寻找发生Bug的原因.">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/blog/',
    scheme: 'Pisces',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: 'Author'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://yoursite.com/blog/2018/08/06/Object-C/Objective-C-学习第三天/"/>





  <title>Objective-C-学习第三天 | 凌浩雨_博客</title>
  








</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="default">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/blog/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">凌浩雨_博客</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/blog/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            Home
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/blog/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            Archives
          </a>
        </li>
      

      
    </ul>
  

  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://yoursite.com/blog/blog/2018/08/06/Object-C/Objective-C-学习第三天/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="凌浩雨">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.jpeg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="凌浩雨_博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">Objective-C-学习第三天</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2018-08-06T18:01:39+08:00">
                2018-08-06
              </time>
            

            

            
          </span>

          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <p>封装<br>一、</p>
<ol>
<li><p>什么是错误<br> 一般情况下，错误是指源代码不符合语法规范，然后编译报错<br> 后果: 程序无法编译</p>
</li>
<li><p>什么是Bug？<br> 程序可以编译、链接、执行，但是程序执行的结果不是我们预想的。<br> 解决: 通过调试寻找发生Bug的原因.</p>
</li>
</ol>
<a id="more"></a>
<ol start="3">
<li><p>异常<br> 程序可以编译、链接、执行，当程序在执行的时候，处于某种特定的条件下，程序就会终止。<br> 后果: 程序立即终止运行</p>
</li>
<li><p>如何处理异常<br> 1). 目的: 为了让程序在执行的时候如果发生了异常而不崩溃<br> 2). 语法</p>
 <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">@try&#123;</span><br><span class="line"></span><br><span class="line">&#125;@catch(NSException *ex)&#123;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p> 将有可能发生异常的代码放在@try中.<br> 当@try中的代码在执行的时候，如果发生了异常，不会奔溃，而是立即跳到@catch中执行代码。<br> 当@catch的代码执行完毕后，结束@try...@catch往下执行.<br> 如果没有发生异常, 则跳过@catch往下执行.</p>
<p> 3). 当@try中的代码在执行的时候发生了异常,@try块发生异常后面的代码不会被执行.</p>
</li>
<li><p>@catch中的代码只有在@try的代码发生异常的时候才会被执行,所以@catch中我们一般情况下写处理异常的代码.</p>
</li>
<li><p>@catch的参数NSException *ex通过%@打印出ex指向对象的值，可以拿到发生异常的原因</p>
</li>
<li><p>@try...@catch后面还可以跟1个@finally块</p>
<pre><code><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">@try&#123;</span><br><span class="line"></span><br><span class="line">&#125;@catch(NSException *ex)&#123;</span><br><span class="line"></span><br><span class="line">&#125;@finally&#123;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
</code></pre></li>
<li><p>@try...@catch并不是万能的, 并不是所有的运行时错误都可以处理的。</p>
</li>
<li><p>类方法<br> 0). 在一个Target中无法访问另外一个Target中的方法.<br> 1). OC中的方法分为两种</p>
<pre><code>a. 对象方法/实例方法
    想要调用对象方法就必须要先创建对象，然后调用
b. 类方法
    类方法的调用不依赖于对象. 如果要调用类方法，不需要创建对象
</code></pre><p> 2). 类方法声明</p>
<pre><code>a. 对象方法的声明:
    对象方法的声明 - 号
    - (返回值)方法名;
    - (void)sayHi;
b. 类方法的声明:
    类方法声明使用 + 号
    + (返回值类型)方法名;
</code></pre><p> 3). 调用</p>
<pre><code>a. 对象方法: 先创建对象再通过对象名来调用
b. 类方法: 不需要创建对象, 直接使用类名来调用
    [类名 类方法名];
</code></pre><p> 4). 分析类方法和对象方法</p>
<pre><code>a. 类方法的特点
    a). 节约空间
    b). 提高效率
</code></pre><p> 5). 在类方法中不能直接访问属性</p>
<pre><code>因为属性只有在对象创建的时候才会创建在对象之中，而类方法在执行的时候有可能还没有对象。
虽然不能直接访问属性，但是我们可以在类方法中创建一个对象访问这个对象
a. 属性是在对象创建的时候跟随着对象一起创建在对象之中
b. 类第1次在访问时回做类加载
</code></pre></li>
<li><p>在类方法中不能使用self来调用其他对象方法<br>[self 方法名];//调用当前类型的方法</p>
</li>
<li><p>在对象方法当中可以调用类方法<br>[类名 方法名];</p>
</li>
<li><p>什么时候可以将方法定义为类方法<br>如果方法不需要直接访问属性,也不需要直接调用其他的对象方法，可以定义为类方法</p>
</li>
<li><p>关于类方法的规范.<br>1). 如果我们写一个类,要求为这个类提供一个与类名同名的方法，这个方法创建 创建一个纯净的对象返回. 苹果和第三方都遵守这个规范</p>
<ul>
<li>(Person *)person;<br>2). 如果希望创建的对象的属性的值由调用者指定,那么这个类方法带参数.<br>类名WithXXX:…</li>
<li>(Person <em>)personWithName:(NSString </em>)name andAge:(int)age;</li>
</ul>
</li>
</ol>
<p>二、</p>
<ol>
<li><p>NSString 是1个数据类型,用来保存OC字符串的</p>
</li>
<li><p>其实NSString是Foundation框架中的1个类,作用存储OC字符串.所以OC中的字符串本质上是用NSString对象来存储的.</p>
</li>
<li><p>完整的标准的创建NSString对象的方式<br> NSString <em>str = [NSString new];<br> NSString </em>str1 = [NSString string];<br> 这种方式创建的字符串是空字符串 @””<br> 但是NSString是最常用的1个对象, 所以OC使用了1种更为简单的方式来创建对象，直接使用@来表示1个OC字符串.<br> NSString *str = @”jack”;<br> @”jack” 本质上是一个NSString对象,str是这个对象的地址.</p>
</li>
<li><p>NSString最常用的类方法<br> 1). + (instancetype)stringWithUTF8String:(const char *)nullTerminatedCString<br> instancetype作为返回值,代表返回当前这个类的对象</p>
 <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">char *str0 = &quot;rost&quot;;</span><br><span class="line">NSString *str1 = [NSString stringWithUTF8String:str0];</span><br></pre></td></tr></table></figure>
<p> 2). + (instancetype)stringWithFormat:(NSString *)format, …使用频率非常高<br> 作用: 拼接1个字符串对象,使用变量或者其他数据拼接成OC字符串</p>
 <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">int age = 19;</span><br><span class="line">NSString *name = @&quot;小明&quot;;</span><br><span class="line">[NSString stringWithFormat: @&quot;大家好,我叫%@, 我今年%d岁.&quot;,name,age]</span><br></pre></td></tr></table></figure>
</li>
<li><p>最长用的对象方法<br> 1). length方法, 返回值NSUInteger,计算字符串长度</p>
 <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">NSString *str = @&quot;itcast&quot;;</span><br><span class="line">NSUInteger len = [str length];</span><br></pre></td></tr></table></figure>
<p> 2). 得到字符串中指定下标的字符</p>
<ul>
<li><p>(unichar)characterAtIndex:(NSUInteger)index;<br>返回值是unichar, 其实就是unsigned short,占据两个字节.<br>如果要输出unichar变两个的值使用%C</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">NSString *str = @&quot;itcast&quot;;</span><br><span class="line">unichar ch = [str characterAtIndex:2];</span><br></pre></td></tr></table></figure>
<p>3). 判断两个字符串是否相同<br>  a. 判断两个字符串内容是否相同, 不要使用==判断<br>  b. 判断相等的方式</p>
<ul>
<li>(BOOL)isEqualToString:(NSString *)aString;<br>判断两个字符串是否相等应该使用上面的方法来判断.<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">NSString *str1 = @&quot;jack&quot;;</span><br><span class="line">NSString *str2 = @&quot;jack&quot;;</span><br><span class="line">[str1 isEqualToString: str2];</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>4). 判断两个字符串大小</p>
<ul>
<li>(NSComparisonResult)compare:(NSString *)string;<br>NSComparisonResult是个枚举, 完全可以使用int来接收返回值.<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">NSString *str1 = @&quot;jack&quot;;</span><br><span class="line">NSString *str2 = @&quot;jack&quot;;</span><br><span class="line">[str1 compare: str2];</span><br></pre></td></tr></table></figure>
</li>
</ul>
</li>
</ul>
</li>
<li><p>匿名对象<br> 1). 之前创建对象的做法:</p>
<pre><code>Person *p1 = [Person new];
让1个指针指向1个对象
</code></pre><p> 2). 匿名对象</p>
<pre><code>没有名字的对象, 如果我们创建一个对象,没有用1个指针存储这个对象的地址,也就是没有任何指针指向这个对象,那么这个对象就叫做匿名对象.
</code></pre><p> 3). 如何使用1个匿名对象</p>
<pre><code>[Person new]-&gt;_name = @&quot;jack&quot;;
[[Person new] sayHi];
</code></pre><p> 4). 注意点</p>
<pre><code>a. 匿名对象只能使用一次
b. 每次创建匿名对象都是不同的对象
</code></pre><p> 5). 使用情况</p>
<pre><code>a. 某个对象只会被使用一次
b. 如果方法的参数是一次对象, 并且这个对象调用者不会使用
</code></pre></li>
</ol>
<p>三、 面向对象的三大特征: 封装、继承、多态<br>封装:<br>    a. 函数就是封装的体现<br>    b. 类就是更高级别的封装<br>    好处: -&gt;屏蔽内部的实现, 外界不需要知道内部是如何实现的<br>          -&gt;方便操作<br>继承:<br>多态:</p>
<ol>
<li><p>setter封装<br> 1). 将属性的@public去掉, 一旦写上@public就可以直接访问对象的这个属性.<br> 2) 为类提供1个方法,专门为这个属性赋值,这个方法我们叫做setter。</p>
<pre><code>a. 这个方法一定是1个对象方法
b. 没有返回值
c. 这个方法的名称必须以set开头, 跟上去掉下划线首字母大写的属性名.
d. 这个方法一定是有参数的, 参数的类型和属性的类型一致, 参数的名称和属性的名称一致(去掉下划线)
e. 在方法的实现中,检测传入的数据是否符合要求
</code></pre> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">// 声明</span><br><span class="line">@interface Person : NSObject&#123;</span><br><span class="line">	int _age;</span><br><span class="line">&#125;</span><br><span class="line">- (void) setAge(int age);</span><br><span class="line">@end</span><br><span class="line">// 实现</span><br><span class="line">@implementation Person</span><br><span class="line">- (void) setAge(int age)&#123;</span><br><span class="line">	_age = age;</span><br><span class="line">&#125;</span><br><span class="line">@end</span><br><span class="line">// 调用</span><br><span class="line">Person *p = [Person new];</span><br><span class="line">[p setAge:10];</span><br></pre></td></tr></table></figure>
</li>
<li><p>getter封装<br> 1). 用来取出属性的值</p>
<pre><code>a. 这个方法一定是一个对象方法
b. 这个方法返回值类型和属性的类型一致
c. 这个方法的名称直接属性的名称(去掉下划线)
d. 这个方法没有参数
e. 外界想要获取这个值，直接调用方法即可.
</code></pre> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">// 声明</span><br><span class="line">@interface Person : NSObject&#123;</span><br><span class="line">	int _age;</span><br><span class="line">&#125;</span><br><span class="line">- (void) setAge(int age);</span><br><span class="line">- (int)age();</span><br><span class="line">@end</span><br><span class="line">// 实现</span><br><span class="line">@implementation Person</span><br><span class="line">- (void) setAge(int age)&#123;</span><br><span class="line">	// 可以做验证</span><br><span class="line">	_age = age;</span><br><span class="line">&#125;</span><br><span class="line">- (int)age()&#123;</span><br><span class="line">	return _age;</span><br><span class="line">&#125;</span><br><span class="line">@end</span><br><span class="line">// 调用</span><br><span class="line">Person *p = [Person new];</span><br><span class="line">[p setAge:10];</span><br><span class="line">[p age];</span><br></pre></td></tr></table></figure>
</li>
<li><p>注意<br> 1) 属性的@public一定要去掉<br> 2) 判断参数的值是否符合逻辑<br> 3) getter/setter方法名极度不规范</p>
</li>
<li><p>什么时候需要封装getter/setter<br> 1). 只要属性需要被外界访问就要回这个属性封装setter和getter, 就算赋值或者取值的时候没有任何逻辑验证<br> 2). 如果属性只在内部访问, 不需要封装getter/setter</p>
</li>
<li><p>只读只写封装<br> 只读封装: 为属性封装的时候，只提供getter属性<br> 只写封装: 为属性封装的时候，只提供setter属性</p>
</li>
<li><p>对象之间的关系<br> 1). 组合关系: 一个类是由其他几个类组合而成的<br> 2). 依赖关系: 一个对象的方法的参数是另外一个类</p>
<pre><code>a. 耦合度: 当一个类修改之后另一个类无法使用,叫高耦合
b. 低耦合：当一个类修改之后另一个类正常使用,叫高耦合
c. 高内聚: 一个对象仅仅只做自己相关的事情
d. 单一职责原则: 一个类只做自己的事情
</code></pre><p> 3). 关联关系: 两个类之间语义级别的一种强依赖关系, 拥有关系<br> 4). 继承关系: </p>
</li>
</ol>

      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/blog/2018/08/06/Object-C/Objective-C-学习第七天/" rel="next" title="Objective-C-学习第七天">
                <i class="fa fa-chevron-left"></i> Objective-C-学习第七天
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/blog/2018/08/06/Object-C/Objective-C-学习第九天/" rel="prev" title="Objective-C-学习第九天">
                Objective-C-学习第九天 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          

  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      

      <section class="site-overview-wrap sidebar-panel sidebar-panel-active">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image"
                src="/blog/images/avatar.jpeg"
                alt="凌浩雨" />
            
              <p class="site-author-name" itemprop="name">凌浩雨</p>
              <p class="site-description motion-element" itemprop="description">专业从事于移动端开发，Android与iOS均有涉及，主做Android开发与React Native开发</p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/blog/archives/">
              
                  <span class="site-state-item-count">393</span>
                  <span class="site-state-item-name">posts</span>
                </a>
              </div>
            

            

            

          </nav>

          

          

          
          

          
          

          

        </div>
      </section>

      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; <span itemprop="copyrightYear">2018</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">凌浩雨</span>

  
</div>


  <div class="powered-by">Powered by <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a></div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">Theme &mdash; <a class="theme-link" target="_blank" href="https://github.com/iissnan/hexo-theme-next">NexT.Pisces</a> v5.1.4</div>




        







        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  
    <script type="text/javascript" src="/blog/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  


  


  <script type="text/javascript" src="/blog/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/blog/js/src/motion.js?v=5.1.4"></script>



  
  


  <script type="text/javascript" src="/blog/js/src/affix.js?v=5.1.4"></script>

  <script type="text/javascript" src="/blog/js/src/schemes/pisces.js?v=5.1.4"></script>



  
  <script type="text/javascript" src="/blog/js/src/scrollspy.js?v=5.1.4"></script>
<script type="text/javascript" src="/blog/js/src/post-details.js?v=5.1.4"></script>



  


  <script type="text/javascript" src="/blog/js/src/bootstrap.js?v=5.1.4"></script>



  


  




	





  





  












  





  

  

  

  
  

  

  

  

</body>
</html>
